package beans;

import bc.CargosNotaDelegate;
import bc.PersonaNaturalDelegate;
import edu.upn.sigemfi.ope.be.CargosNota;
import edu.upn.sigemfi.ope.be.DetalleCargosNota;
import edu.upn.sigemfi.seg.be.PersonaNatural;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apache.commons.lang.StringUtils;

public class CargosNotaController {

    private CargosNotaDelegate delegado;
    private PersonaNaturalDelegate delegadoPersona;
    private CargosNota cargosNota;
    private String criterio;
    private PersonaNatural cliente;

    public PersonaNatural getCliente() {
        return cliente;
    }

    public void setCliente(PersonaNatural cliente) {
        this.cliente = cliente;
    }

    public CargosNotaController() {
        delegado = new CargosNotaDelegate();

        delegadoPersona = new PersonaNaturalDelegate();

        cliente = new PersonaNatural();
    }

    public String getCriterio() {
        return criterio;
    }

    public void setCriterio(String criterio) {
        this.criterio = criterio;
    }

    public CargosNota getCargosNota() {
        return cargosNota;
    }

    public void setCargosNota(CargosNota cargosNota) {
        this.cargosNota = cargosNota;
    }

    public String nuevo() {
        cliente = new PersonaNatural();

        cargosNota = new CargosNota();
        cargosNota.setCodigoNota("106");
        return "cargo";
    }

    public String cancelar() {
        cargosNota = null;
        return "volver";
    }

    public String buscarPersona() {

        if (!validarDni()) {
            return "";
        }
        try {


            //   clienteBuscado = delegadoPersona

            PersonaNatural cli = delegadoPersona.buscarPersonaPorDni(cliente.getDniPersona());
            if (cli != null) {
                cliente = cli;
            } else {
                mostrarMensaje("Error", "No se encontro cliente con el dni especificado", FacesMessage.SEVERITY_ERROR);
            }
        } catch (Exception ex) {
            Logger.getLogger(CargosNotaController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarMensaje("Error", "Buscar Persona", FacesMessage.SEVERITY_ERROR);
        }

        return "";
    }

    public String registrar() {
        if (cargosNota.getMotivo().length() > 50) {
            mostrarMensaje("Error", "El motivo excede el maximo de caracteres permitidos", FacesMessage.SEVERITY_ERROR);
            return "";
        }
        try {
            if (cargosNota != null) {
                Boolean est = true;
                cargosNota.setEstado(est);
                cargosNota.setFidSegPersona(delegadoPersona.buscar(cliente));
                delegado.crear(cargosNota);
                mostrarMensaje("Exito", "El registro del cargosNota se realizo exitosamente.", FacesMessage.SEVERITY_INFO);
            } else {
                mostrarMensaje("Error", "Asegurese de haber creado una cargosNota", FacesMessage.SEVERITY_ERROR);
                cargosNota = new CargosNota();
                return "";
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "volver";
    }

    public String editar() {
        cliente = cargosNota.getFidSegPersona();
        return "editar";
    }

    public String actualizar() {

        if (cargosNota.getMotivo().length() > 50) {
            mostrarMensaje("Error", "El motivo excede el maximo de caracteres permitidos", FacesMessage.SEVERITY_ERROR);
            return "";
        }

        try {
            if (cargosNota != null) {
                cargosNota.setFidSegPersona(cliente);
                delegado.editar(cargosNota);
                mostrarMensaje("Exito", "La actualizacion de la cargosNota se realizo exitosamente.", FacesMessage.SEVERITY_INFO);
            } else {
                mostrarMensaje("Error", "Asegurese de haber seleccionado una cargosNota", FacesMessage.SEVERITY_ERROR);
                return "";
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "listar";
    }

    public String eliminar() {
        try {
            if (cargosNota != null) {
                delegado.eliminar(cargosNota);
                mostrarMensaje("Exito", "La eliminacion del cargosNota se realizo exitosamente.", FacesMessage.SEVERITY_INFO);
            } else {
                mostrarMensaje("Error", "Asegurese de haber seleccionado una cargosNota", FacesMessage.SEVERITY_ERROR);
                return "";
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "listar";
    }

    public List<CargosNota> getCargosNotas() {
        try {
            return delegado.getCargosNotas();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public CargosNota buscar(Long idCargosNota) {
        try {
            return delegado.getCargoNota(idCargosNota);
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    public SelectItem[] getCargosNotaSI() {
        SelectItem[] select = null;
        try {
            List<CargosNota> lista = getCargosNotas();
            if (lista != null) {
                select = new SelectItem[lista.size() + 1];
                int i = 0;
                select[i++] = new SelectItem(null, "Seleccione una CargosNota");
                for (CargosNota go : lista) {
                    select[i++] = new SelectItem(go, go.getIdCargosNota().toString());
                }
            } else {
                select = new SelectItem[1];
                select[0] = new SelectItem(null, "No se encontraron CargosNotas");
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
            select = new SelectItem[1];
            select[0] = new SelectItem(null, "Error al consultar los datos");
        }
        return select;
    }

    //Metodo para mostrar mensajes en la pagina
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public SelectItem[] getDetalles() {
        SelectItem[] selects = null;
        List<DetalleCargosNota> detalles;
        try {
            detalles = delegado.getDetalles();
            selects = new SelectItem[detalles.size() + 1];
            int i = 0;
            selects[i++] = new SelectItem(null, "Seleccione un Detalle");
            for (DetalleCargosNota d : detalles) {
                selects[i++] = new SelectItem(d, d.getNombre());
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar los datos");
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return selects;
    }

    public CargosNota buscar_CargosNota(Long id) throws Exception {
        return delegado.getCargoNota(id);
    }

    private boolean validarDni() {
        if ((!StringUtils.isNumeric(cliente.getDniPersona())) || (cliente.getDniPersona().length() != 8)) {
            mostrarMensaje("ERROR", "El DNI debe ser un valor numerico y de 8 digitos", FacesMessage.SEVERITY_ERROR);
            return false;
        }
        return true;
    }
}
